home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / comdlg.Cls < prev    next >
Text File  |  1997-06-14  |  33KB  |  927 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "GCommonDialog"
  6. Attribute VB_GlobalNameSpace = True
  7. Attribute VB_Creatable = True
  8. Attribute VB_PredeclaredId = False
  9. Attribute VB_Exposed = True
  10. Option Explicit
  11.  
  12. Public Enum EErrorCommonDialog
  13.     eeBaseCommonDialog = 13450  ' CommonDialog
  14. End Enum
  15.  
  16. Private Type OPENFILENAME
  17.     lStructSize As Long          ' Filled with UDT size
  18.     hwndOwner As Long            ' Tied to Owner
  19.     hInstance As Long            ' Ignored (used only by templates)
  20.     lpstrFilter As String        ' Tied to Filter
  21.     lpstrCustomFilter As String  ' Ignored (exercise for reader)
  22.     nMaxCustFilter As Long       ' Ignored (exercise for reader)
  23.     nFilterIndex As Long         ' Tied to FilterIndex
  24.     lpstrFile As String          ' Tied to FileName
  25.     nMaxFile As Long             ' Handled internally
  26.     lpstrFileTitle As String     ' Tied to FileTitle
  27.     nMaxFileTitle As Long        ' Handled internally
  28.     lpstrInitialDir As String    ' Tied to InitDir
  29.     lpstrTitle As String         ' Tied to DlgTitle
  30.     Flags As Long                ' Tied to Flags
  31.     nFileOffset As Integer       ' Ignored (exercise for reader)
  32.     nFileExtension As Integer    ' Ignored (exercise for reader)
  33.     lpstrDefExt As String        ' Tied to DefaultExt
  34.     lCustData As Long            ' Ignored (needed for hooks)
  35.     lpfnHook As Long             ' Ignored (good luck with hooks)
  36.     lpTemplateName As Long       ' Ignored (good luck with templates)
  37. End Type
  38.  
  39. Private Declare Function GetOpenFileName Lib "COMDLG32" _
  40.     Alias "GetOpenFileNameA" (file As OPENFILENAME) As Long
  41. Private Declare Function GetSaveFileName Lib "COMDLG32" _
  42.     Alias "GetSaveFileNameA" (file As OPENFILENAME) As Long
  43. Private Declare Function GetFileTitle Lib "COMDLG32" _
  44.     Alias "GetFileTitleA" (ByVal szFile As String, _
  45.     ByVal szTitle As String, ByVal cbBuf As Long) As Long
  46.  
  47. Public Enum EOpenFile
  48.     OFN_READONLY = &H1
  49.     OFN_OVERWRITEPROMPT = &H2
  50.     OFN_HIDEREADONLY = &H4
  51.     OFN_NOCHANGEDIR = &H8
  52.     OFN_SHOWHELP = &H10
  53.     OFN_ENABLEHOOK = &H20
  54.     OFN_ENABLETEMPLATE = &H40
  55.     OFN_ENABLETEMPLATEHANDLE = &H80
  56.     OFN_NOVALIDATE = &H100
  57.     OFN_ALLOWMULTISELECT = &H200
  58.     OFN_EXTENSIONDIFFERENT = &H400
  59.     OFN_PATHMUSTEXIST = &H800
  60.     OFN_FILEMUSTEXIST = &H1000
  61.     OFN_CREATEPROMPT = &H2000
  62.     OFN_SHAREAWARE = &H4000
  63.     OFN_NOREADONLYRETURN = &H8000
  64.     OFN_NOTESTFILECREATE = &H10000
  65.     OFN_NONETWORKBUTTON = &H20000
  66.     OFN_NOLONGNAMES = &H40000
  67.     OFN_EXPLORER = &H80000
  68.     OFN_NODEREFERENCELINKS = &H100000
  69.     OFN_LONGNAMES = &H200000
  70. End Enum
  71.  
  72. Private Type TCHOOSECOLOR
  73.     lStructSize As Long
  74.     hwndOwner As Long
  75.     hInstance As Long
  76.     rgbResult As Long
  77.     lpCustColors As Long
  78.     Flags As Long
  79.     lCustData As Long
  80.     lpfnHook As Long
  81.     lpTemplateName As Long
  82. End Type
  83.  
  84. Private Declare Function ChooseColor Lib "COMDLG32.DLL" _
  85.     Alias "ChooseColorA" (Color As TCHOOSECOLOR) As Long
  86.  
  87. Public Enum EChooseColor
  88.     CC_RGBInit = &H1
  89.     CC_FullOpen = &H2
  90.     CC_PreventFullOpen = &H4
  91.     CC_ColorShowHelp = &H8
  92. ' Win95 only
  93.     CC_SolidColor = &H80
  94.     CC_AnyColor = &H100
  95. ' End Win95 only
  96.     CC_ENABLEHOOK = &H10
  97.     CC_ENABLETEMPLATE = &H20
  98.     CC_EnableTemplateHandle = &H40
  99. End Enum
  100.  
  101. Private Type TCHOOSEFONT
  102.     lStructSize As Long         ' Filled with UDT size
  103.     hwndOwner As Long           ' Caller's window handle
  104.     hDC As Long                 ' Printer DC/IC or NULL
  105.     lpLogFont As Long           ' Pointer to LOGFONT
  106.     iPointSize As Long          ' 10 * size in points of font
  107.     Flags As Long               ' Type flags
  108.     rgbColors As Long           ' Returned text color
  109.     lCustData As Long           ' Data passed to hook function
  110.     lpfnHook As Long            ' Pointer to hook function
  111.     lpTemplateName As Long      ' Custom template name
  112.     hInstance As Long           ' Instance handle for template
  113.     lpszStyle As String         ' Return style field
  114.     nFontType As Integer        ' Font type bits
  115.     iAlign As Integer           ' Filler
  116.     nSizeMin As Long            ' Minimum point size allowed
  117.     nSizeMax As Long            ' Maximum point size allowed
  118. End Type
  119.  
  120. Private Declare Function ChooseFont Lib "COMDLG32" _
  121.     Alias "ChooseFontA" (chfont As TCHOOSEFONT) As Long
  122.  
  123. Public Enum EChooseFont
  124.     CF_ScreenFonts = &H1
  125.     CF_PrinterFonts = &H2
  126.     CF_BOTH = &H3
  127.     CF_FontShowHelp = &H4
  128.     CF_UseStyle = &H80
  129.     CF_EFFECTS = &H100
  130.     CF_AnsiOnly = &H400
  131.     CF_NoVectorFonts = &H800
  132.     CF_NoOemFonts = CF_NoVectorFonts
  133.     CF_NoSimulations = &H1000
  134.     CF_LimitSize = &H2000
  135.     CF_FixedPitchOnly = &H4000
  136.     CF_WYSIWYG = &H8000  ' Must also have ScreenFonts And PrinterFonts
  137.     CF_ForceFontExist = &H10000
  138.     CF_ScalableOnly = &H20000
  139.     CF_TTOnly = &H40000
  140.     CF_NoFaceSel = &H80000
  141.     CF_NoStyleSel = &H100000
  142.     CF_NoSizeSel = &H200000
  143.     ' Win95 only
  144.     CF_SelectScript = &H400000
  145.     CF_NoScriptSel = &H800000
  146.     CF_NoVertFonts = &H1000000
  147.  
  148.     CF_InitToLogFontStruct = &H40
  149.     CF_Apply = &H200
  150.     CF_EnableHook = &H8
  151.     CF_EnableTemplate = &H10
  152.     CF_EnableTemplateHandle = &H20
  153.     CF_FontNotSupported = &H238
  154. End Enum
  155.  
  156. ' These are extra nFontType bits that are added to what is returned to the
  157. ' EnumFonts callback routine
  158.  
  159. Public Enum EFontType
  160.     Simulated_FontType = &H8000
  161.     Printer_FontType = &H4000
  162.     Screen_FontType = &H2000
  163.     Bold_FontType = &H100
  164.     Italic_FontType = &H200
  165.     Regular_FontType = &H400
  166. End Enum
  167.  
  168. Private Type TPRINTDLG
  169.     lStructSize As Long
  170.     hwndOwner As Long
  171.     hDevMode As Long
  172.     hDevNames As Long
  173.     hDC As Long
  174.     Flags As Long
  175.     nFromPage As Integer
  176.     nToPage As Integer
  177.     nMinPage As Integer
  178.     nMaxPage As Integer
  179.     nCopies As Integer
  180.     hInstance As Long
  181.     lCustData As Long
  182.     lpfnPrintHook As Long
  183.     lpfnSetupHook As Long
  184.     lpPrintTemplateName As Long
  185.     lpSetupTemplateName As Long
  186.     hPrintTemplate As Long
  187.     hSetupTemplate As Long
  188. End Type
  189.  
  190. '  DEVMODE collation selections
  191. Private Const DMCOLLATE_FALSE = 0
  192. Private Const DMCOLLATE_TRUE = 1
  193.  
  194. Private Declare Function PrintDlg Lib "COMDLG32.DLL" _
  195.     Alias "PrintDlgA" (prtdlg As TPRINTDLG) As Integer
  196.  
  197. Public Enum EPrintDialog
  198.     PD_ALLPAGES = &H0
  199.     PD_SELECTION = &H1
  200.     PD_PAGENUMS = &H2
  201.     PD_NOSELECTION = &H4
  202.     PD_NOPAGENUMS = &H8
  203.     PD_COLLATE = &H10
  204.     PD_PRINTTOFILE = &H20
  205.     PD_PRINTSETUP = &H40
  206.     PD_NOWARNING = &H80
  207.     PD_RETURNDC = &H100
  208.     PD_RETURNIC = &H200
  209.     PD_RETURNDEFAULT = &H400
  210.     PD_SHOWHELP = &H800
  211.     PD_ENABLEPRINTHOOK = &H1000
  212.     PD_ENABLESETUPHOOK = &H2000
  213.     PD_ENABLEPRINTTEMPLATE = &H4000
  214.     PD_ENABLESETUPTEMPLATE = &H8000
  215.     PD_ENABLEPRINTTEMPLATEHANDLE = &H10000
  216.     PD_ENABLESETUPTEMPLATEHANDLE = &H20000
  217.     PD_USEDEVMODECOPIES = &H40000
  218.     PD_USEDEVMODECOPIESANDCOLLATE = &H40000
  219.     PD_DISABLEPRINTTOFILE = &H80000
  220.     PD_HIDEPRINTTOFILE = &H100000
  221.     PD_NONETWORKBUTTON = &H200000
  222. End Enum
  223.  
  224. Private Type DEVNAMES
  225.     wDriverOffset As Integer
  226.     wDeviceOffset As Integer
  227.     wOutputOffset As Integer
  228.     wDefault As Integer
  229. End Type
  230.  
  231. ' New Win95 Page Setup dialogs are up to you
  232.  
  233. Private Type TPAGESETUPDLG
  234.     lStructSize                 As Long
  235.     hwndOwner                   As Long
  236.     hDevMode                    As Long
  237.     hDevNames                   As Long
  238.     Flags                       As Long
  239.     ptPaperSize                 As POINTL
  240.     rtMinMargin                 As RECT
  241.     rtMargin                    As RECT
  242.     hInstance                   As Long
  243.     lCustData                   As Long
  244.     lpfnPageSetupHook           As Long
  245.     lpfnPagePaintHook           As Long
  246.     lpPageSetupTemplateName     As Long
  247.     hPageSetupTemplate          As Long
  248. End Type
  249.  
  250. ' EPaperSize constants same as vbPRPS constants
  251. Public Enum EPaperSize
  252.     epsLetter = 1          ' Letter, 8 1/2 x 11 in.
  253.     epsLetterSmall         ' Letter Small, 8 1/2 x 11 in.
  254.     epsTabloid             ' Tabloid, 11 x 17 in.
  255.     epsLedger              ' Ledger, 17 x 11 in.
  256.     epsLegal               ' Legal, 8 1/2 x 14 in.
  257.     epsStatement           ' Statement, 5 1/2 x 8 1/2 in.
  258.     epsExecutive           ' Executive, 7 1/2 x 10 1/2 in.
  259.     epsA3                  ' A3, 297 x 420 mm
  260.     epsA4                  ' A4, 210 x 297 mm
  261.     epsA4Small             ' A4 Small, 210 x 297 mm
  262.     epsA5                  ' A5, 148 x 210 mm
  263.     epsB4                  ' B4, 250 x 354 mm
  264.     epsB5                  ' B5, 182 x 257 mm
  265.     epsFolio               ' Folio, 8 1/2 x 13 in.
  266.     epsQuarto              ' Quarto, 215 x 275 mm
  267.     eps10x14               ' 10 x 14 in.
  268.     eps11x17               ' 11 x 17 in.
  269.     epsNote                ' Note, 8 1/2 x 11 in.
  270.     epsEnv9                ' Envelope #9, 3 7/8 x 8 7/8 in.
  271.     epsEnv10               ' Envelope #10, 4 1/8 x 9 1/2 in.
  272.     epsEnv11               ' Envelope #11, 4 1/2 x 10 3/8 in.
  273.     epsEnv12               ' Envelope #12, 4 1/2 x 11 in.
  274.     epsEnv14               ' Envelope #14, 5 x 11 1/2 in.
  275.     epsCSheet              ' C size sheet
  276.     epsDSheet              ' D size sheet
  277.     epsESheet              ' E size sheet
  278.     epsEnvDL               ' Envelope DL, 110 x 220 mm
  279.     epsEnvC3               ' Envelope C3, 324 x 458 mm
  280.     epsEnvC4               ' Envelope C4, 229 x 324 mm
  281.     epsEnvC5               ' Envelope C5, 162 x 229 mm
  282.     epsEnvC6               ' Envelope C6, 114 x 162 mm
  283.     epsEnvC65              ' Envelope C65, 114 x 229 mm
  284.     epsEnvB4               ' Envelope B4, 250 x 353 mm
  285.     epsEnvB5               ' Envelope B5, 176 x 250 mm
  286.     epsEnvB6               ' Envelope B6, 176 x 125 mm
  287.     epsEnvItaly            ' Envelope, 110 x 230 mm
  288.     epsenvmonarch          ' Envelope Monarch, 3 7/8 x 7 1/2 in.
  289.     epsEnvPersonal         ' Envelope, 3 5/8 x 6 1/2 in.
  290.     epsFanfoldUS           ' U.S. Standard Fanfold, 14 7/8 x 11 in.
  291.     epsFanfoldStdGerman    ' German Standard Fanfold, 8 1/2 x 12 in.
  292.     epsFanfoldLglGerman    ' German Legal Fanfold, 8 1/2 x 13 in.
  293.     epsUser = 256          ' User-defined
  294. End Enum
  295.  
  296. ' EPrintQuality constants same as vbPRPQ constants
  297. Public Enum EPrintQuality
  298.     epqDraft = -1
  299.     epqLow = -2
  300.     epqMedium = -3
  301.     epqHigh = -4
  302. End Enum
  303.  
  304. Public Enum EOrientation
  305.     eoPortrait = 1
  306.     eoLandscape
  307. End Enum
  308.  
  309. Private Declare Function PageSetupDlg Lib "COMDLG32" _
  310.     Alias "PageSetupDlgA" (lppage As TPAGESETUPDLG) As Boolean
  311.  
  312. Public Enum EPageSetup
  313.     PSD_Defaultminmargins = &H0 ' Default (printer's)
  314.     PSD_InWinIniIntlMeasure = &H0
  315.     PSD_MINMARGINS = &H1
  316.     PSD_MARGINS = &H2
  317.     PSD_INTHOUSANDTHSOFINCHES = &H4
  318.     PSD_INHUNDREDTHSOFMILLIMETERS = &H8
  319.     PSD_DISABLEMARGINS = &H10
  320.     PSD_DISABLEPRINTER = &H20
  321.     PSD_NoWarning = &H80
  322.     PSD_DISABLEORIENTATION = &H100
  323.     PSD_ReturnDefault = &H400
  324.     PSD_DISABLEPAPER = &H200
  325.     PSD_ShowHelp = &H800
  326.     PSD_EnablePageSetupHook = &H2000
  327.     PSD_EnablePageSetupTemplate = &H8000
  328.     PSD_EnablePageSetupTemplateHandle = &H20000
  329.     PSD_EnablePagePaintHook = &H40000
  330.     PSD_DisablePagePainting = &H80000
  331. End Enum
  332.  
  333. Public Enum EPageSetupUnits
  334.     epsuInches
  335.     epsuMillimeters
  336. End Enum
  337.  
  338. ' Common dialog errors
  339.  
  340. Private Declare Function CommDlgExtendedError Lib "COMDLG32" () As Long
  341.  
  342. Public Enum EDialogError
  343.     CDERR_DIALOGFAILURE = &HFFFF
  344.  
  345.     CDERR_GENERALCODES = &H0
  346.     CDERR_STRUCTSIZE = &H1
  347.     CDERR_INITIALIZATION = &H2
  348.     CDERR_NOTEMPLATE = &H3
  349.     CDERR_NOHINSTANCE = &H4
  350.     CDERR_LOADSTRFAILURE = &H5
  351.     CDERR_FINDRESFAILURE = &H6
  352.     CDERR_LOADRESFAILURE = &H7
  353.     CDERR_LOCKRESFAILURE = &H8
  354.     CDERR_MEMALLOCFAILURE = &H9
  355.     CDERR_MEMLOCKFAILURE = &HA
  356.     CDERR_NOHOOK = &HB
  357.     CDERR_REGISTERMSGFAIL = &HC
  358.  
  359.     PDERR_PRINTERCODES = &H1000
  360.     PDERR_SETUPFAILURE = &H1001
  361.     PDERR_PARSEFAILURE = &H1002
  362.     PDERR_RETDEFFAILURE = &H1003
  363.     PDERR_LOADDRVFAILURE = &H1004
  364.     PDERR_GETDEVMODEFAIL = &H1005
  365.     PDERR_INITFAILURE = &H1006
  366.     PDERR_NODEVICES = &H1007
  367.     PDERR_NODEFAULTPRN = &H1008
  368.     PDERR_DNDMMISMATCH = &H1009
  369.     PDERR_CREATEICFAILURE = &H100A
  370.     PDERR_PRINTERNOTFOUND = &H100B
  371.     PDERR_DEFAULTDIFFERENT = &H100C
  372.  
  373.     CFERR_CHOOSEFONTCODES = &H2000
  374.     CFERR_NOFONTS = &H2001
  375.     CFERR_MAXLESSTHANMIN = &H2002
  376.  
  377.     FNERR_FILENAMECODES = &H3000
  378.     FNERR_SUBCLASSFAILURE = &H3001
  379.     FNERR_INVALIDFILENAME = &H3002
  380.     FNERR_BUFFERTOOSMALL = &H3003
  381.  
  382.     CCERR_CHOOSECOLORCODES = &H5000
  383. End Enum
  384.  
  385. ' Array of custom colors lasts for life of app
  386. Private alCustom(0 To 15) As Long, fNotFirst As Boolean
  387.  
  388. Public Enum EPrintRange
  389.     eprAll
  390.     eprPageNumbers
  391.     eprSelection
  392. End Enum
  393.  
  394. #If fComponent Then
  395. Private Sub Class_Initialize()
  396.     InitColors
  397. End Sub
  398. #End If
  399.  
  400. Function VBGetOpenFileName(FileName As String, _
  401.                            Optional FileTitle As String, _
  402.                            Optional FileMustExist As Boolean = True, _
  403.                            Optional MultiSelect As Boolean = False, _
  404.                            Optional ReadOnly As Boolean = False, _
  405.                            Optional HideReadOnly As Boolean = False, _
  406.                            Optional filter As String = "All (*.*)| *.*", _
  407.                            Optional FilterIndex As Long = 1, _
  408.                            Optional InitDir As String, _
  409.                            Optional DlgTitle As String, _
  410.                            Optional DefaultExt As String, _
  411.                            Optional Owner As Long = -1, _
  412.                            Optional Flags As Long = 0) As Boolean
  413.  
  414.     Dim opfile As OPENFILENAME, s As String, afFlags As Long
  415. With opfile
  416.     .lStructSize = Len(opfile)
  417.     
  418.     ' Add in specific flags and strip out non-VB flags
  419.     .Flags = (-FileMustExist * OFN_FILEMUSTEXIST) Or _
  420.              (-MultiSelect * OFN_ALLOWMULTISELECT) Or _
  421.              (-ReadOnly * OFN_READONLY) Or _
  422.              (-HideReadOnly * OFN_HIDEREADONLY) Or _
  423.              (Flags And CLng(Not (OFN_ENABLEHOOK Or _
  424.                                   OFN_ENABLETEMPLATE)))
  425.     ' Owner can take handle of owning window
  426.     If Owner <> -1 Then .hwndOwner = Owner
  427.     ' InitDir can take initial directory string
  428.     .lpstrInitialDir = InitDir
  429.     ' DefaultExt can take default extension
  430.     .lpstrDefExt = DefaultExt
  431.     ' DlgTitle can take dialog box title
  432.     .lpstrTitle = DlgTitle
  433.     
  434.     ' To make Windows-style filter, replace | and : with nulls
  435.     Dim ch As String, i As Integer
  436.     For i = 1 To Len(filter)
  437.         ch = Mid$(filter, i, 1)
  438.         If ch = "|" Or ch = ":" Then
  439.             s = s & vbNullChar
  440.         Else
  441.             s = s & ch
  442.         End If
  443.     Next
  444.     ' Put double null at end
  445.     s = s & vbNullChar & vbNullChar
  446.     .lpstrFilter = s
  447.     .nFilterIndex = FilterIndex
  448.  
  449.     ' Pad file and file title buffers to maximum path
  450.     s = FileName & String$(cMaxPath - Len(FileName), 0)
  451.     .lpstrFile = s
  452.     .nMaxFile = cMaxPath
  453.     s = FileTitle & String$(cMaxFile - Len(FileTitle), 0)
  454.     .lpstrFileTitle = s
  455.     .nMaxFileTitle = cMaxFile
  456.     ' All other fields set to zero
  457.     
  458.     If GetOpenFileName(opfile) Then
  459.         VBGetOpenFileName = True
  460.         FileName = MUtility.StrZToStr(.lpstrFile)
  461.         FileTitle = MUtility.StrZToStr(.lpstrFileTitle)
  462.         Flags = .Flags
  463.         ' Return the filter index
  464.         FilterIndex = .nFilterIndex
  465.         ' Look up the filter the user selected and return that
  466.         filter = FilterLookup(.lpstrFilter, FilterIndex)
  467.         If (.Flags And OFN_READONLY) Then ReadOnly = True
  468.     Else
  469.         VBGetOpenFileName = False
  470.         FileName = sEmpty
  471.         FileTitle = sEmpty
  472.         Flags = 0
  473.         FilterIndex = -1
  474.         filter = sEmpty
  475.     End If
  476. End With
  477. End Function
  478.  
  479. Function VBGetSaveFileName(FileName As String, _
  480.                            Optional FileTitle As String, _
  481.                            Optional OverWritePrompt As Boolean = True, _
  482.                            Optional filter As String = "All (*.*)| *.*", _
  483.                            Optional FilterIndex As Long = 1, _
  484.                            Optional InitDir As String, _
  485.                            Optional DlgTitle As String, _
  486.                            Optional DefaultExt As String, _
  487.                            Optional Owner As Long = -1, _
  488.                            Optional Flags As Long) As Boolean
  489.             
  490.     Dim opfile As OPENFILENAME, s As String
  491. With opfile
  492.     .lStructSize = Len(opfile)
  493.     
  494.     ' Add in specific flags and strip out non-VB flags
  495.     .Flags = (-OverWritePrompt * OFN_OVERWRITEPROMPT) Or _
  496.              OFN_HIDEREADONLY Or _
  497.              (Flags And CLng(Not (OFN_ENABLEHOOK Or _
  498.                                   OFN_ENABLETEMPLATE)))
  499.     ' Owner can take handle of owning window
  500.     If Owner <> -1 Then .hwndOwner = Owner
  501.     ' InitDir can take initial directory string
  502.     .lpstrInitialDir = InitDir
  503.     ' DefaultExt can take default extension
  504.     .lpstrDefExt = DefaultExt
  505.     ' DlgTitle can take dialog box title
  506.     .lpstrTitle = DlgTitle
  507.     
  508.     ' Make new filter with bars (|) replacing nulls and double null at end
  509.     Dim ch As String, i As Integer
  510.     For i = 1 To Len(filter)
  511.         ch = Mid$(filter, i, 1)
  512.         If ch = "|" Or ch = ":" Then
  513.             s = s & vbNullChar
  514.         Else
  515.             s = s & ch
  516.         End If
  517.     Next
  518.     ' Put double null at end
  519.     s = s & vbNullChar & vbNullChar
  520.     .lpstrFilter = s
  521.     .nFilterIndex = FilterIndex
  522.  
  523.     ' Pad file and file title buffers to maximum path
  524.     s = FileName & String$(cMaxPath - Len(FileName), 0)
  525.     .lpstrFile = s
  526.     .nMaxFile = cMaxPath
  527.     s = FileTitle & String$(cMaxFile - Len(FileTitle), 0)
  528.     .lpstrFileTitle = s
  529.     .nMaxFileTitle = cMaxFile
  530.     ' All other fields zero
  531.     
  532.     If GetSaveFileName(opfile) Then
  533.         VBGetSaveFileName = True
  534.         FileName = MUtility.StrZToStr(.lpstrFile)
  535.         FileTitle = MUtility.StrZToStr(.lpstrFileTitle)
  536.         Flags = .Flags
  537.         ' Return the filter index
  538.         FilterIndex = .nFilterIndex
  539.         ' Look up the filter the user selected and return that
  540.         filter = FilterLookup(.lpstrFilter, FilterIndex)
  541.     Else
  542.         VBGetSaveFileName = False
  543.         FileName = sEmpty
  544.         FileTitle = sEmpty
  545.         Flags = 0
  546.         FilterIndex = 0
  547.         filter = sEmpty
  548.     End If
  549. End With
  550. End Function
  551.  
  552. Private Function FilterLookup(ByVal sFilters As String, ByVal iCur As Long) As String
  553.     Dim iStart As Long, iEnd As Long, s As String
  554.     iStart = 1
  555.     If sFilters = sEmpty Then Exit Function
  556.     Do
  557.         ' Cut out both parts marked by null character
  558.         iEnd = InStr(iStart, sFilters, vbNullChar)
  559.         If iEnd = 0 Then Exit Function
  560.         iEnd = InStr(iEnd + 1, sFilters, vbNullChar)
  561.         If iEnd Then
  562.             s = Mid$(sFilters, iStart, iEnd - iStart)
  563.         Else
  564.             s = Mid$(sFilters, iStart)
  565.         End If
  566.         iStart = iEnd + 1
  567.         If iCur = 1 Then
  568.             FilterLookup = s
  569.             Exit Function
  570.         End If
  571.         iCur = iCur - 1
  572.     Loop While iCur
  573. End Function
  574.  
  575. Function VBGetFileTitle(sFile As String) As String
  576.     Dim sFileTitle As String, cFileTitle As Integer
  577.  
  578.     cFileTitle = cMaxPath
  579.     sFileTitle = String$(cMaxPath, 0)
  580.     cFileTitle = GetFileTitle(sFile, sFileTitle, cMaxPath)
  581.     If cFileTitle Then
  582.         VBGetFileTitle = sEmpty
  583.     Else
  584.         VBGetFileTitle = Left$(sFileTitle, InStr(sFileTitle, vbNullChar) - 1)
  585.     End If
  586.  
  587. End Function
  588.  
  589. ' ChooseColor wrapper
  590. Function VBChooseColor(Color As Long, _
  591.                        Optional AnyColor As Boolean = True, _
  592.                        Optional FullOpen As Boolean = False, _
  593.                        Optional DisableFullOpen As Boolean = False, _
  594.                        Optional Owner As Long = -1, _
  595.                        Optional Flags As Long) As Boolean
  596.  
  597.     Dim chclr As TCHOOSECOLOR
  598.     chclr.lStructSize = Len(chclr)
  599.     
  600.     ' Color must get reference variable to receive result
  601.     ' Flags can get reference variable or constant with bit flags
  602.     ' Owner can take handle of owning window
  603.     If Owner <> -1 Then chclr.hwndOwner = Owner
  604.  
  605.     ' Assign color (default uninitialized value of zero is good default)
  606.     chclr.rgbResult = Color
  607.  
  608.     ' Mask out unwanted bits
  609.     Dim afMask As Long
  610.     afMask = CLng(Not (CC_ENABLEHOOK Or _
  611.                        CC_ENABLETEMPLATE))
  612.     ' Pass in flags
  613.     chclr.Flags = afMask And (CC_RGBInit Or _
  614.                   IIf(AnyColor, CC_AnyColor, CC_SolidColor) Or _
  615.                   (-FullOpen * CC_FullOpen) Or _
  616.                   (-DisableFullOpen * CC_PreventFullOpen))
  617.  
  618.     ' If first time, initialize to white
  619.     If fNotFirst = False Then InitColors
  620.  
  621.     chclr.lpCustColors = VarPtr(alCustom(0))
  622.     ' All other fields zero
  623.     
  624.     If ChooseColor(chclr) Then
  625.         VBChooseColor = True
  626.         Color = chclr.rgbResult
  627.     Else
  628.         VBChooseColor = False
  629.         Color = -1
  630.     End If
  631.  
  632. End Function
  633.  
  634. Private Sub InitColors()
  635.     Dim i As Integer
  636.     ' Initialize with first 16 system interface colors
  637.     For i = 0 To 15
  638.         alCustom(i) = GetSysColor(i)
  639.     Next
  640.     fNotFirst = True
  641. End Sub
  642.  
  643. ' Property to read or modify custom colors (use to save colors in registry)
  644. Public Property Get CustomColor(i As Integer) As Long
  645.     ' If first time, initialize to white
  646.     If fNotFirst = False Then InitColors
  647.     If i >= 0 And i <= 15 Then
  648.         CustomColor = alCustom(i)
  649.     Else
  650.         CustomColor = -1
  651.     End If
  652. End Property
  653.  
  654. Public Property Let CustomColor(i As Integer, iValue As Long)
  655.     ' If first time, initialize to system colors
  656.     If fNotFirst = False Then InitColors
  657.     If i >= 0 And i <= 15 Then
  658.         alCustom(i) = iValue
  659.     End If
  660. End Property
  661.  
  662. ' ChooseFont wrapper
  663. Function VBChooseFont(CurFont As Font, _
  664.                       Optional PrinterDC As Long = -1, _
  665.                       Optional Owner As Long = -1, _
  666.                       Optional Color As Long = vbBlack, _
  667.                       Optional MinSize As Long = 0, _
  668.                       Optional MaxSize As Long = 0, _
  669.                       Optional Flags As Long = 0) As Boolean
  670.  
  671.     ' Unwanted Flags bits
  672.     Const CF_FontNotSupported = CF_Apply Or CF_EnableHook Or CF_EnableTemplate
  673.     
  674.     ' Flags can get reference variable or constant with bit flags
  675.     ' PrinterDC can take printer DC
  676.     If PrinterDC = -1 Then
  677.         PrinterDC = 0
  678.         If Flags And CF_PrinterFonts Then PrinterDC = Printer.hDC
  679.     Else
  680.         Flags = Flags Or CF_PrinterFonts
  681.     End If
  682.     ' Must have some fonts
  683.     If (Flags And CF_PrinterFonts) = 0 Then Flags = Flags Or CF_ScreenFonts
  684.     ' Color can take initial color, receive chosen color
  685.     If Color <> vbBlack Then Flags = Flags Or CF_EFFECTS
  686.     ' MinSize can be minimum size accepted
  687.     If MinSize Then Flags = Flags Or CF_LimitSize
  688.     ' MaxSize can be maximum size accepted
  689.     If MaxSize Then Flags = Flags Or CF_LimitSize
  690.  
  691.     ' Put in required internal flags and remove unsupported
  692.     Flags = (Flags Or CF_InitToLogFontStruct) And Not CF_FontNotSupported
  693.     
  694.     ' Initialize LOGFONT variable
  695.     Dim fnt As LOGFONT
  696.     Const PointsPerTwip = 1440 / 72
  697.     fnt.lfHeight = -(CurFont.Size * (PointsPerTwip / Screen.TwipsPerPixelY))
  698.     fnt.lfWeight = CurFont.Weight
  699.     fnt.lfItalic = CurFont.Italic
  700.     fnt.lfUnderline = CurFont.Underline
  701.     fnt.lfStrikeOut = CurFont.Strikethrough
  702.     ' Other fields zero
  703.     MBytes.StrToBytes fnt.lfFaceName, CurFont.Name
  704.  
  705.     ' Initialize TCHOOSEFONT variable
  706.     Dim cf As TCHOOSEFONT
  707.     cf.lStructSize = Len(cf)
  708.     If Owner <> -1 Then cf.hwndOwner = Owner
  709.     cf.hDC = PrinterDC
  710.     cf.lpLogFont = VarPtr(fnt)
  711.     cf.iPointSize = CurFont.Size * 10
  712.     cf.Flags = Flags
  713.     cf.rgbColors = Color
  714.     cf.nSizeMin = MinSize
  715.     cf.nSizeMax = MaxSize
  716.     
  717.     ' All other fields zero
  718.     
  719.     If ChooseFont(cf) Then
  720.         VBChooseFont = True
  721.         Flags = cf.Flags
  722.         Color = cf.rgbColors
  723.         CurFont.Bold = cf.nFontType And Bold_FontType
  724.         'CurFont.Italic = cf.nFontType And Italic_FontType
  725.         CurFont.Italic = fnt.lfItalic
  726.         CurFont.Strikethrough = fnt.lfStrikeOut
  727.         CurFont.Underline = fnt.lfUnderline
  728.         CurFont.Weight = fnt.lfWeight
  729.         CurFont.Size = cf.iPointSize / 10
  730.         CurFont.Name = MBytes.BytesToStr(fnt.lfFaceName)
  731.     Else
  732.         VBChooseFont = False
  733.     End If
  734.  
  735. End Function
  736.  
  737. ' PrintDlg wrapper
  738. Function VBPrintDlg(hDC As Long, _
  739.                     Optional PrintRange As EPrintRange = eprAll, _
  740.                     Optional DisablePageNumbers As Boolean, _
  741.                     Optional FromPage As Long = 1, _
  742.                     Optional ToPage As Long = &HFFFF, _
  743.                     Optional DisableSelection As Boolean, _
  744.                     Optional Copies As Integer, _
  745.                     Optional ShowPrintToFile As Boolean, _
  746.                     Optional DisablePrintToFile As Boolean = True, _
  747.                     Optional PrintToFile As Boolean, _
  748.                     Optional Collate As Boolean, _
  749.                     Optional PreventWarning As Boolean, _
  750.                     Optional Owner As Long, _
  751.                     Optional Printer As Object, _
  752.                     Optional Flags As Long) As Boolean
  753.     Dim afFlags As Long, afMask As Long
  754.     
  755.     ' Set PRINTDLG flags
  756.     afFlags = (-DisablePageNumbers * PD_NOPAGENUMS) Or _
  757.               (-DisablePrintToFile * PD_DISABLEPRINTTOFILE) Or _
  758.               (-DisableSelection * PD_NOSELECTION) Or _
  759.               (-PrintToFile * PD_PRINTTOFILE) Or _
  760.               (-(Not ShowPrintToFile) * PD_HIDEPRINTTOFILE) Or _
  761.               (-PreventWarning * PD_NOWARNING) Or _
  762.               (-Collate * PD_COLLATE) Or _
  763.               PD_USEDEVMODECOPIESANDCOLLATE Or _
  764.               PD_RETURNDC
  765.     If PrintRange = eprPageNumbers Then
  766.         afFlags = afFlags Or PD_PAGENUMS
  767.     ElseIf PrintRange = eprSelection Then
  768.         afFlags = afFlags Or PD_SELECTION
  769.     End If
  770.     ' Mask out unwanted bits
  771.     afMask = CLng(Not (PD_ENABLEPRINTHOOK Or _
  772.                        PD_ENABLEPRINTTEMPLATE))
  773.     afMask = afMask And _
  774.              CLng(Not (PD_ENABLESETUPHOOK Or _
  775.                        PD_ENABLESETUPTEMPLATE))
  776.     
  777.     ' Fill in PRINTDLG structure
  778.     Dim pd As TPRINTDLG
  779.     pd.lStructSize = Len(pd)
  780.     pd.hwndOwner = Owner
  781.     pd.Flags = afFlags And afMask
  782.     pd.nFromPage = FromPage
  783.     pd.nToPage = ToPage
  784.     pd.nMinPage = 1
  785.     pd.nMaxPage = &HFFFF
  786.     
  787.     ' Show Print dialog
  788.     If PrintDlg(pd) Then
  789.         VBPrintDlg = True
  790.         ' Return dialog values in parameters
  791.         hDC = pd.hDC
  792.         If (pd.Flags And PD_PAGENUMS) Then
  793.             PrintRange = eprPageNumbers
  794.         ElseIf (pd.Flags And PD_SELECTION) Then
  795.             PrintRange = eprSelection
  796.         Else
  797.             PrintRange = eprAll
  798.         End If
  799.         FromPage = pd.nFromPage
  800.         ToPage = pd.nToPage
  801.         PrintToFile = (pd.Flags And PD_PRINTTOFILE)
  802.         ' Get DEVMODE structure from PRINTDLG
  803.         Dim dvmode As DEVMODE, pDevMode As Long
  804.         pDevMode = GlobalLock(pd.hDevMode)
  805.         CopyMemory dvmode, ByVal pDevMode, Len(dvmode)
  806.         Call GlobalUnlock(pd.hDevMode)
  807.         ' Get Copies and Collate settings from DEVMODE structure
  808.         Copies = dvmode.dmCopies
  809.         Collate = (dvmode.dmCollate = DMCOLLATE_TRUE)
  810.         ' Set default printer properties
  811.         On Error Resume Next
  812.         Printer.Copies = Copies
  813.         Printer.Orientation = dvmode.dmOrientation
  814.         Printer.PaperSize = dvmode.dmPaperSize
  815.         Printer.PrintQuality = dvmode.dmPrintQuality
  816.     Else
  817.         VBPrintDlg = False
  818.     End If
  819.     
  820. End Function
  821.  
  822. ' PageSetupDlg wrapper
  823. Function VBPageSetupDlg(Optional Owner As Long, _
  824.                         Optional DisableMargins As Boolean, _
  825.                         Optional DisableOrientation As Boolean, _
  826.                         Optional DisablePaper As Boolean, _
  827.                         Optional DisablePrinter As Boolean, _
  828.                         Optional LeftMargin As Long, _
  829.                         Optional MinLeftMargin As Long, _
  830.                         Optional RightMargin As Long, _
  831.                         Optional MinRightMargin As Long, _
  832.                         Optional TopMargin As Long, _
  833.                         Optional MinTopMargin As Long, _
  834.                         Optional BottomMargin As Long, _
  835.                         Optional MinBottomMargin As Long, _
  836.                         Optional PaperSize As EPaperSize = epsLetter, _
  837.                         Optional Orientation As EOrientation = eoPortrait, _
  838.                         Optional PrintQuality As EPrintQuality = epqDraft, _
  839.                         Optional Units As EPageSetupUnits = epsuInches, _
  840.                         Optional Printer As Object, _
  841.                         Optional Flags As Long) As Boolean
  842.     Dim afFlags As Long, afMask As Long
  843.     ' Mask out unwanted bits
  844.     afMask = Not (PSD_EnablePagePaintHook Or _
  845.                   PSD_EnablePageSetupHook Or _
  846.                   PSD_EnablePageSetupTemplate)
  847.     ' Set TPAGESETUPDLG flags
  848.     afFlags = (-DisableMargins * PSD_DISABLEMARGINS) Or _
  849.               (-DisableOrientation * PSD_DISABLEORIENTATION) Or _
  850.               (-DisablePaper * PSD_DISABLEPAPER) Or _
  851.               (-DisablePrinter * PSD_DISABLEPRINTER) Or _
  852.               PSD_MARGINS Or PSD_MINMARGINS And afMask
  853.     Dim lUnits As Long
  854.     If Units = epsuInches Then
  855.         afFlags = afFlags Or PSD_INTHOUSANDTHSOFINCHES
  856.         lUnits = 1000
  857.     Else
  858.         afFlags = afFlags Or PSD_INHUNDREDTHSOFMILLIMETERS
  859.         lUnits = 100
  860.     End If
  861.     
  862.     Dim psd As TPAGESETUPDLG
  863.     ' Fill in PRINTDLG structure
  864.     psd.lStructSize = Len(psd)
  865.     psd.hwndOwner = Owner
  866.     psd.rtMargin.Top = TopMargin * lUnits
  867.     psd.rtMargin.Left = LeftMargin * lUnits
  868.     psd.rtMargin.bottom = BottomMargin * lUnits
  869.     psd.rtMargin.Right = RightMargin * lUnits
  870.     psd.rtMinMargin.Top = MinTopMargin * lUnits
  871.     psd.rtMinMargin.Left = MinLeftMargin * lUnits
  872.     psd.rtMinMargin.bottom = MinBottomMargin * lUnits
  873.     psd.rtMinMargin.Right = MinRightMargin * lUnits
  874.     psd.Flags = afFlags
  875.     
  876.     ' Show Print dialog
  877.     If PageSetupDlg(psd) Then
  878.         VBPageSetupDlg = True
  879.         ' Return dialog values in parameters
  880.         TopMargin = psd.rtMargin.Top / lUnits
  881.         LeftMargin = psd.rtMargin.Left / lUnits
  882.         BottomMargin = psd.rtMargin.bottom / lUnits
  883.         RightMargin = psd.rtMargin.Right / lUnits
  884.         MinTopMargin = psd.rtMinMargin.Top / lUnits
  885.         MinLeftMargin = psd.rtMinMargin.Left / lUnits
  886.         MinBottomMargin = psd.rtMinMargin.bottom / lUnits
  887.         MinRightMargin = psd.rtMinMargin.Right / lUnits
  888.         
  889.         ' Get DEVMODE structure from PRINTDLG
  890.         Dim dvmode As DEVMODE, pDevMode As Long
  891.         pDevMode = GlobalLock(psd.hDevMode)
  892.         CopyMemory dvmode, ByVal pDevMode, Len(dvmode)
  893.         Call GlobalUnlock(psd.hDevMode)
  894.         PaperSize = dvmode.dmPaperSize
  895.         Orientation = dvmode.dmOrientation
  896.         PrintQuality = dvmode.dmPrintQuality
  897.         ' Set default printer properties
  898.         On Error Resume Next
  899.         Printer.Copies = dvmode.dmCopies
  900.         Printer.Orientation = dvmode.dmOrientation
  901.         Printer.PaperSize = dvmode.dmPaperSize
  902.         Printer.PrintQuality = dvmode.dmPrintQuality
  903.     End If
  904.  
  905. End Function
  906.  
  907. #If fComponent = 0 Then
  908. Private Sub ErrRaise(e As Long)
  909.     Dim sText As String, sSource As String
  910.     If e > 1000 Then
  911.         sSource = App.ExeName & ".CommonDialog"
  912.         Select Case e
  913.         Case eeBaseCommonDialog
  914.             BugAssert True
  915.        ' Case ee...
  916.        '     Add additional errors
  917.         End Select
  918.         Err.Raise COMError(e), sSource, sText
  919.     Else
  920.         ' Raise standard Visual Basic error
  921.         sSource = App.ExeName & ".VBError"
  922.         Err.Raise e, sSource
  923.     End If
  924. End Sub
  925. #End If
  926.  
  927.